home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / ForCLI / Expand.lha / Expand / Expand.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-05-14  |  3.9 KB  |  154 lines

  1. /*
  2.  * Copyright (c) 1980 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #ifndef lint
  35. char copyright[] =
  36. "@(#) Copyright (c) 1980 The Regents of the University of California.\n\
  37.  All rights reserved.\n";
  38. #endif /* not lint */
  39.  
  40. #ifndef lint
  41. static char sccsid[] = "@(#)expand.c    5.3 (Berkeley) 6/1/90";
  42. #endif /* not lint */
  43.  
  44. #include <stdio.h>
  45. /*
  46.  * expand - expand tabs to equivalent spaces
  47.  */
  48. int nstops;
  49. int tabstops[100];
  50.  
  51. getstops(register char *cp);
  52.  
  53. static char VersionId[] = "\0$VER: Amiga Expand (Joseph Hillenburg) 1.00BSD";
  54.  
  55. main(int argc,char **argv)
  56. {
  57.     register int c, column, n;
  58.  
  59.     argc--, argv++;
  60.     do {
  61.         while (argc > 0 && argv[0][0] == '-') {
  62.             getstops(argv[0]);
  63.             argc--, argv++;
  64.         }
  65.         if(argc > 0) {
  66.             if (freopen(argv[0], "r", stdin) == NULL) {
  67.                 perror(argv[0]);
  68.                 exit(1);
  69.             }
  70.             argc--, argv++;
  71.         }
  72.         column = 0;
  73.         for(;;) {
  74.             c = getc(stdin);
  75.             if(c == -1)
  76.                 break;
  77.             switch(c) {
  78.  
  79.             case '\t':
  80.                 if(nstops == 0) {
  81.                     do {
  82.                         putchar(' ');
  83.                         column++;
  84.                     } while(column & 07);
  85.                     continue;
  86.                 }
  87.                 if(nstops == 1) {
  88.                     do {
  89.                         putchar(' ');
  90.                         column++;
  91.                     } while(((column - 1) % tabstops[0]) != (tabstops[0] - 1));
  92.                     continue;
  93.                 }
  94.                 for(n = 0; n < nstops; n++)
  95.                     if(tabstops[n] > column)
  96.                         break;
  97.                 if(n == nstops) {
  98.                     putchar(' ');
  99.                     column++;
  100.                     continue;
  101.                 }
  102.                 while(column < tabstops[n]) {
  103.                     putchar(' ');
  104.                     column++;
  105.                 }
  106.                 continue;
  107.  
  108.             case '\b':
  109.                 if(column)
  110.                     column--;
  111.                 putchar('\b');
  112.                 continue;
  113.  
  114.             default:
  115.                 putchar(c);
  116.                 column++;
  117.                 continue;
  118.  
  119.             case '\n':
  120.                 putchar(c);
  121.                 column = 0;
  122.                 continue;
  123.             }
  124.         }
  125.     } while(argc > 0);
  126.     exit(0);
  127. }
  128.  
  129. getstops(register char *cp)
  130. {
  131.     register int i;
  132.  
  133.     nstops = 0;
  134.     cp++;
  135.     for(;;) {
  136.         i = 0;
  137.         while(*cp >= '0' && *cp <= '9')
  138.             i = i * 10 + *cp++ - '0';
  139.         if (i <= 0 || i > 256) {
  140. bad:
  141.             fprintf(stderr, "Bad tab stop spec\n");
  142.          fprintf(stderr, "expand [ -tabstop ] [ -tab1,tab2,...,tabn ] [ file ...  ]\n");
  143.             exit(1);
  144.         }
  145.         if(nstops > 0 && i <= tabstops[nstops-1])
  146.             goto bad;
  147.         tabstops[nstops++] = i;
  148.         if(*cp == 0)
  149.             break;
  150.         if(*cp++ != ',')
  151.             goto bad;
  152.     }
  153. }
  154.